const express = require('express')
const redis = require("redis");
const { promisify } = require("util");

const app = express()
app.use(express.json())

const client = redis.createClient();

const getAsync = promisify(client.get).bind(client);
const setAsync = promisify(client.set).bind(client);
const hmsetAsync = promisify(client.hmset).bind(client);

// ？？？？？？
console.log(client);
// 扔一个漂流瓶
app.post('/', async (req, res, next) => {
  try {
    const bottle = req.body

    // 为每个漂流瓶随机生成一个不重复的 id
    const bottleId = uuidv4()

    const type = {
      male: 0,
      female: 1
    }

    // 根据漂流瓶类型的不同将漂流瓶保存到不同的数据库
    // 主要目的是为了方便使用 Redis 中的 RANDOMKEY 命令：该命令返回当前数据库中的一个随机键，不能加任何条件
    await SELECT(type[bottle.type])
 
    // 将数据存为哈希
    await HMSET(bottleId, bottle)

    // 设置漂流瓶生存期为 1 天
    await EXPIRE(bottleId, 60 * 60 * 24)

    res.status(201).json({
      bottle: {
        id: bottleId,
        ...bottle
      }
    })
  } catch (err) {
    next(err)
  }
})
// 捡一个漂流瓶
app.get('/', async (req, res, next) => {
  try {
    const query = req.query

    const type = {
      all: Math.round(Math.random()),
      male: 0,
      femail: 1
    }

    query.type = query.type || 'all'

    // 根据请求的瓶子类型到不同的数据库中取数据
    await SELECT(type[query.type])

    // 随机返回一个漂流瓶 ID
    const bottleId = await RANDOMKEY()

    if (!bottleId) {
      res.status(200).json({
        message: '大海空空如也...'
      })
    }

    // 根据漂流瓶 ID 获取完整的漂流瓶信息
    const bottle = await HGETALL(bottleId)
    
    res.status(200).json({
      bottle
    })

    // 从 Redis 中删除捡到的漂流瓶
    DEL(bottleId)
  } catch (err) {
    console.log(err)
    next(err)
  }
})
// 统一处理异常
app.use((err, req, res, next) => {
  res.status(500).json({
    error: err.message
  })
})

app.listen(3000, () => {
  console.log('running...')
})